package com.cyn.controller.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

@Component
@ServerEndpoint("/websocket/{userId}")
@Slf4j
public class WebSocket {
    private Session session;
    private static Map<String, WebSocket> webSocketMap = new ConcurrentHashMap<>();
    /**
     * 客户端发起websocket连接请求成功建立连接时触发
     * @param session
     * @param userId
     */
    @OnOpen
    public void onOpen(Session session, @PathParam("userId") String userId) {
        this.session = session;
        this.webSocketMap.put(userId, this);
        log.info("【websocket消息】有新的连接, 总数:{}", webSocketMap.size());
    }
 
    /**
     * 客户端关闭时websocket连接时触发
     */
    @OnClose
    public void onClose(@PathParam("userId") String userId) throws IOException {
        session.close();
        this.webSocketMap.remove(userId);
        log.info("【websocket消息】连接断开, 总数:{}", webSocketMap.size());
    }
 
    /**
     * 客户端向服务端发送消息时触发
     * @param session
     * @param message
     * @throws IOException
     */
    @OnMessage
    public void onMessage(Session session,  String message) throws IOException {
        Map<String, List<String>> requestParameterMap = session.getRequestParameterMap();
        String userId = requestParameterMap.get("userId").get(0);
        log.info("【websocket消息】收到客户端发来的消息:{}", message);
//        if (message.startsWith("hello")) {
//            session.getBasicRemote().sendText("你好,"+userId+"!信息已经收到，欢迎光临" + message.replace("hello", ""));
//        }

        session.getBasicRemote().sendText(userId+"****"+message+"*****"+webSocketMap.size());
//        webSocketMap.forEach((k,v)->{
//            System.out.println(k+"****"+v);
//            try {
//
//            } catch (IOException e) {
//                e.printStackTrace();
//            }
//        });
    }
    /**
     * 当 websocket 建立连接时出现异常会触发
     * @param session
     */
//    @OnError
//    public void onError(Session session){
//        Map<String, List<String>> requestParameterMap = session.getRequestParameterMap();
//        String userId = requestParameterMap.get("userId").get(0);
//        log.info("连接异常，请求参数："+userId);
//    }
    @OnError
    public void onError(Throwable throwable){
        log.error("连接错误，原因："+throwable.getMessage());
    }

}